package com.telit.firecommand.service;

import com.telit.common.entity.DataReturn;
import com.telit.firecommand.dto.CameraPresetInfoDTO;
import com.telit.firecommand.model.camera.QueryDevicesRequest;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;


/**
 * 视频监控操作（调用第三方API）
 *
 * @author yuezhuang
 * @date 2022-08-30
 */
public interface CameraMonitorService {

    /**
     * 获取监控点预览取流rtsp URL
     *
     * @param indexCode 监控点唯一标识
     *
     * @return 取流URL
     */
    String queryRtspUrl(String indexCode);

    /**
     * 获取监控点预览取流flv URL
     *
     * @param indexCode 监控点唯一标识
     *
     * @return 取流URL
     */
    String queryFlvpUrl(String indexCode);

    /**
     * 分页获取监控点资源
     *
     * @param queryDevicesRequest QueryDevicesRequest
     *
     * @return String
     */
    List<Map> queryDevices(QueryDevicesRequest queryDevicesRequest);

    /**
     * h5登录
     *
     * @param user     用户
     * @param password 密码
     *
     * @return h5登录链接
     */
    Object h5Login(String user, String password);

    /**
     * h5保活接口
     */
    Object h5KeepAlive(String session);

    /**
     * h5云台控制
     */
    Object ptzCtl(String token, String action, String speed, String session);

    String setPresets(Long cameraId, String indexCode, String presetName, Integer presetIndex, Integer standTime,
                      Integer speed);

    String delPresets(Long cameraId, String indexCode, Integer presetIndex, Long id);

    void delAllPresets(Long cameraId, String indexCode);

    List<CameraPresetInfoDTO> searchPresets(Long cameraId, String indexCode);

    /**
     * 根据监控点编号进行云台操作
     *
     * @param indexCode   监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode
     * @param presetIndex 预置点编号，整数，通常在300以内
     *
     * @return String
     */
    String goToPresets(String indexCode, Integer presetIndex);

    /**
     * 根据监控点编号进行云台操作
     *
     * @param indexCode   监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode
     * @param action      0-开始 1-停止 注：GOTO_PRESET命令下填任意值均可转到预置点,建议填0即可
     * @param command     不区分大小写
     *                    说明：
     *                    LEFT 左转
     *                    RIGHT右转
     *                    UP 上转
     *                    DOWN 下转
     *                    ZOOM_IN 焦距变大
     *                    ZOOM_OUT 焦距变小
     *                    LEFT_UP 左上
     *                    LEFT_DOWN 左下
     *                    RIGHT_UP 右上
     *                    RIGHT_DOWN 右下 FOCUS_NEAR 焦点前移
     *                    FOCUS_FAR 焦点后移 IRIS_ENLARGE 光圈扩大
     *                    IRIS_REDUCE 光圈缩小
     *                    WIPER_SWITCH 接通雨刷开关
     *                    START_RECORD_TRACK开始记录轨迹
     *                    STOP_RECORD_TRACK 停止记录轨迹
     *                    START_TRACK 开始轨迹
     *                    STOP_TRACK 停止轨迹
     *
     *                    以下命令presetIndex不可
     *                    为空：
     *                    GOTO_PRESET到预置点
     * @param speed       云台速度，取值范围为1-100，默认50
     * @param presetIndex 预置点编号，整数，通常在300以内
     * @param cruiseIndex 自动巡航控制时有效
     *
     * @return String
     */
    String ptzControl(String indexCode, Integer action, String command, Integer speed, Integer presetIndex,
                      Integer cruiseIndex);

    /**
     * 查询巡航路径
     *
     * @param indexCode 监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode
     * @param nameLike  巡航路径名称，名称模糊搜索，为空或者为null时忽略此条件
     *
     * @return String
     */
    String searchRoutes(String indexCode, String nameLike);

    /**
     * 添加或修改巡航路径
     *
     * @param cruiseRoutes 请求参数json
     *
     * @return String
     */
    String updateRoutes(String cruiseRoutes);

    /**
     * 删除巡航路径
     *
     * @param indexCode   监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode
     * @param cruiseIndex 巡航路径序号，范围：[1,8]，可通过查询巡航路径接口获取返回参数cruiseIndex
     *
     * @return String
     */
    String deleteRoutes(String indexCode, Integer cruiseIndex);

    /**
     * 巡航控制
     *
     * @param indexCode      监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode
     * @param monitoringType 1-和普威视监控设备
     * @param command        控制命令，不区分大小写，开始巡航：START_CRUISE；停止巡航：STOP_CRUISE
     * @param cruiseIndex    巡航路径序号，范围：[1,8]，可通过查询巡航路径接口获取返回参数cruiseIndex
     *
     * @return String
     */
    String controlRoutes(String indexCode, String monitoringType, String command, Integer cruiseIndex);

    /**
     * 获取监控点预览取流flv URL
     *
     * @param cameraIndexCode 监控点唯一标识
     * @param beginTime       开始时间
     * @param endTime         结束时间
     * @param protocol        取流协议（应用层协议)，
     *                        “rtsp”:RTSP协议（标准rtsp协议常用于如开源工具vlc取流播放，非标rtsp协议一般用于对接海康sdk。标准rtsp协议与非标rtsp协议如何指定请参考expand字段。）；
     *                        “rtmp”:RTMP协议（RTMP协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备；只支持H264视频编码和AAC音频编码；RTMP回放要求录像片段连续，需要在URL后自行拼接beginTime=20190902T100303&endTime=20190902T100400，其中20190902T100303至20190902T100400为查询出有连续录像的时间段。对于不连续的录像，需要分段查询分段播放）；
     *                        “hls”:HLS协议（一般用于H5页面取流播放，HLS协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备；只支持H264视频编码和AAC音频编码；hls协议只支持云存储，不支持设备存储，云存储版本要求v2.2.4及以上的2.x版本，或v3.0.5及以上的3.x版本需在运管中心-视频联网共享中切换成启动平台外置VOD）；
     *                        “ws”:Websocket协议（一般用于H5视频播放器取流播放）。此字段未指定默认为rtsp协议
     * @param recordLocation  录像存储位置（0-中心存储，1-设备存储）,默认中心存储
     *
     * @return String
     */
    String playbackURLs(String cameraIndexCode, String beginTime, String endTime, String protocol,
                        String recordLocation);


    // ================================== 以下接口调用windows服务 ================================

    /**
     * 视频下载
     *
     * @param userId          用户id
     * @param cameraIndexCode 监控点唯一标识
     * @param beginTime       开始时间
     * @param endTime         结束时间
     * @param recordLocation  录像存储位置（0-中心存储，1-设备存储）,默认中心存储
     *
     * @return DataReturn Obj
     */
    DataReturn downloadVideo(String userId, String cameraIndexCode, String beginTime, String endTime,
                             String recordLocation);

    /**
     * 查询是否下载完成
     *
     * @param userId          用户id
     * @param cameraIndexCode 监控点唯一标识
     *
     * @return DataReturn Obj
     */
    DataReturn queryIsDownloadByCameraId(String userId, String cameraIndexCode);

    /**
     * 下载文件
     *
     * @param fileName 文件名称
     * @param response 输出流
     */
    void download(String fileName, HttpServletResponse response);

    /**
     * 删除文件
     *
     * @param fileName 文件名称
     *
     * @return DataReturn Obj
     */
    DataReturn delete(String fileName);

    /**
     * 订阅火情事件
     * @param callbackUrl
     * @param eventTypes
     * @return
     */
    String subscribeEvent(String callbackUrl, int[] eventTypes);

    /**
     * 取消订阅火情事件
     * @param eventTypes
     * @return
     */
    String unSubscribeEvent(int[] eventTypes);

    /**
     * 查询订阅火情事件
     *
     * @return
     */
    String viewEvent();

    /**
     * 将预置点添加到巡航路线中
     */
    void setToCruise(Long cameraId, String indexCode, Integer presetIndex, Long id, Integer standTime, Integer speed);

}
